/**
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表
 * 字母异位词 是由重新排列源单词的字母得到的一个新单词，所有源单词中的字母都恰好只用一次
 */

/**
 * 1、检查是否为空数组
 * 2、建立一个长度为26的数组，起始值为0
 * 3、遍历所有字符串，将字母的出现频率放到数组的对应位置里（利用ascil码）
 * 4、遍历数组，按照相同字母出现频率进行分组归类（使用hashmap）
 * 5、遍历map，将结果返回
*/

var groupAnagrams = function (strs) {
  if (strs.length === 0) {
    return [];
  }

  const map = new Map();

  for (const str of strs) {
    // 创建一个长度为26，内容为0的数组
    let character = Array(26).fill(0);

    for (let i = 0; i < str.length; i++) {
      // 如何将字符刚好对应到character数组上
      // a的ascil码是97，b的ascil码是98，以此类推。。。。
      // a的ascil码减去97刚好等于0，也就是character第一个位置上
      const ascil = str.charCodeAt(i) - 97;
      character[ascil]++;
    }
    const key = character.join();
    if (map.has(key)) {
      // map.set(key, map.get(key).push(str))
      map.set(key, [...map.get(key), str]);
    } else {
      map.set(key, [str]);
    }
  }

  const result = [];
  for (const arr of map) {
    result.push(arr[1]);
  }

  return result;
};

let strs = ['dfg', 'gdj', 'tyu', 'uio', 'iuo']
console.log(groupAnagrams(strs))